clear;
clc;
addpath(genpath('./util'))
%大尺度衰弱参数
D0=1;
C0=10^(-30/10);
exponent_BS_LIS=2.2;
exponent_LIS_USER=2.8;

%BS位置
x_BS=0;
y_BS=0;
z_BS=25;

%LIS位置
x_IRS=0;
y_IRS=10;
z_IRS=40;

%用户位置范围
x_left=-50;
x_right=50;
y_left=10;
y_right=110;

%噪声功率
sigma=10^(-80/10)*10^(-3);

%BS-LIS距离
d_BS_LIS=sqrt((x_BS-x_IRS)^2+(y_BS-y_IRS)^2);
[pathGain_BS_LIS] = pathLOS(d_BS_LIS,D0,exponent_BS_LIS,C0)*10^(7);

L = 16;
K = 4;
M=8;
F=eye(L);
NUM_timesamples = 1;
pathGain = ones(K,1);
K_factor = 5*ones(K,1);
e=10^(-3);
%disp('H1');
for ueIdx = 1:K
    tau(ueIdx)= 0; %rand;sqrt(0.01)
end
p_correlation = 0.3*ones(K,1);
for k = 1:K  
    for kk=1:L
        for ll=1:L
            T2(kk,ll,k) = (p_correlation(k))^(abs(kk-ll));
        end
    end
end


for i=1:NUM_timesamples
    for k=1:K
        x_user=rand*(x_right-x_left)+x_left;
        y_user=rand*(y_right-y_left)+y_left;
        d_IRS_user=sqrt((x_user-x_IRS)^2+(y_user-y_IRS)^2);
        pathGain(k,1)=pathLOS(d_IRS_user,D0,exponent_LIS_USER,C0)*10^(7);
    end
    H1(:,:,i)=randn(L,M)+j*randn(L,M);
    H1(:,:,i) = H1(:,:,i)*sqrt(L*pathGain_BS_LIS/trace(H1(:,:,i)*H1(:,:,i)'));
    Hbar2(:,:,i) =randn(K,L)+j*randn(K,L);
    for ueIdx = 1:K
        T2(1:L,1:L,ueIdx) = pathGain(ueIdx)*(L/trace(T2(1:L,1:L,ueIdx)))*T2(1:L,1:L,ueIdx)/(K_factor(ueIdx)+1);
        Hbar2(ueIdx,1:L,i) = Hbar2(ueIdx,1:L,i) * sqrt(pathGain(ueIdx)) * sqrt(1/trace(Hbar2(ueIdx,1:L,i)*Hbar2(ueIdx,1:L,i)')) * sqrt(K_factor(ueIdx)/(K_factor(ueIdx)+1)) ;
    end
end

F_temp=eye(L);
P=5:10:55;
d=5;
f=5;
c1=2;
c2=2;
NUM=70;
result_PSO1=zeros(1,length(P));
result_PSO2=zeros(1,length(P));
result_PSO3=zeros(1,length(P));

%发送功率
power1=10^(45/10)*10^(-3);
power2=10^(55/10)*10^(-3);
power3=10^(65/10)*10^(-3);

alpha_low=10^(-1);
alpha_up=10^(2);

for i=1:NUM_timesamples
    i
    for j = 1:length(P)
        p=P(j);
        rho1 = power1/sigma/10^(14);
  
        rho2 = power2/sigma/10^(14);
        
        rho3 = power3/sigma/10^(14);
        
        
       [ F_best_PSO1,max_PSO1,alpha1 ]=AO(p,c1,c2,L,NUM,K,T2,Hbar2(:,:,i),tau,rho1,M,H1(:,:,i),e,"PSO",alpha_low,alpha_up);
       [ F_best_PSO2,max_PSO2,alpha2 ]=AO(p,c1,c2,L,NUM,K,T2,Hbar2(:,:,i),tau,rho2,M,H1(:,:,i),e,"PSO",alpha_low,alpha_up);
       [ F_best_PSO3,max_PSO3,alpha3 ]=AO(p,c1,c2,L,NUM,K,T2,Hbar2(:,:,i),tau,rho3,M,H1(:,:,i),e,"PSO",alpha_low,alpha_up);
       result_PSO1(j)=result_PSO1(j)+max_PSO1;
       result_PSO2(j)=result_PSO2(j)+max_PSO2;
       result_PSO3(j)=result_PSO3(j)+max_PSO3;
    end
end
plot(P,result_PSO1./NUM_timesamples,'r-o','LineWidth',1.5,'MarkerSize',6);
hold on;
plot(P,result_PSO2./NUM_timesamples,'b-*','LineWidth',1.5,'MarkerSize',6);
hold on;
plot(P,result_PSO3./NUM_timesamples,'go-','LineWidth',1.5,'MarkerSize',6);
grid on;
h1=xlabel('P');
h2=ylabel('Large-System Approximation Sum Rate (bps/Hz)');
legend('power=45dbm','power=55dbm','power=65dbm');
